/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import javax.inject.Named;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.common.ISubject;
import pe.com.cotelasa.scp.controlador.backingBean.BKCompraDetalleNotaCredito;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_COMPRA;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.entidad.CompraDetalleNotaCredito;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleCompraFacturacion;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@SuppressWarnings("serial")
@Named(value = "MBCompraDetalleNotaCredito")
@Scope("request")
public class MBCompraDetalleNotaCredito extends MBGenerico implements ISubject, Serializable {

    private static Logger logger = Logger.getLogger(MBCompraDetalleNotaCredito.class);
    @Inject
    private BKCompraDetalleNotaCredito bk;
    @Inject
    private IServicioCompraFacturacion servicioCompraFacturacion;
    @Autowired
    private BKSession session;

    public void cargaInicial(ActionEvent actionEvent) {
        bk.setDetalleNotaCredito(new CompraDetalleNotaCredito());
        bk.setListaFacturas(new ArrayList<CompraFacturacion>());
        bk.setListaDetalleFacturacion(new ArrayList<DetalleCompraFacturacion>());
        bk.setFacturaSeleccionado(null);
        bk.setFacturaDetalleSeleccionado(null);
        bk.setNumero("");
        bk.setRazon((String) actionEvent.getComponent().getAttributes().get("razon"));

        bk.setUpdate((String) actionEvent.getComponent().getAttributes().get("update"));
        bk.setDialog((String) actionEvent.getComponent().getAttributes().get("dialog"));
        
        System.out.println("razon: "+bk.getRazon());
    }

    public void buscarFacturas() {
        CompraFacturacion documento = new CompraFacturacion();
        documento.setIdProveedor(new Proveedor());
        documento.getIdProveedor().setRazonSocial(bk.getRazon());
        //String serie = bk.getSerie();
        documento.setTipoCompPago(TIPO_DOC_COMPRA.FACTURA.getValor());
        documento.setIdEmpresa(session.getEmpresa());
        documento.setNumeroFactura(bk.getNumero());
        documento.setIdOrdenPedido(new OrdenPedido(-1));
        documento.setIdOrdenCompraServicio(new OrdenCompraServicio(-1));
        documento.setEstadoCancelacion('0');
        try {
            bk.setListaDetalleFacturacion(new ArrayList<DetalleCompraFacturacion>());
            bk.setListaFacturas((List<CompraFacturacion>) servicioCompraFacturacion.buscarCompraFacturacionPorFiltro(documento,null,null));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void buscarDetalleFacturas(SelectEvent event) {

        try {
            System.out.println("factura: "+(CompraFacturacion) event.getObject());
            bk.setFacturaSeleccionado(servicioCompraFacturacion.conseguirCompraFacturacionPorId(((CompraFacturacion) event.getObject()).getId()));

            bk.setListaDetalleFacturacion(new ArrayList<DetalleCompraFacturacion>());
            bk.setFacturaDetalleSeleccionado(new DetalleCompraFacturacion());
            for (DetalleCompraFacturacion detalle : bk.getFacturaSeleccionado().getDetalleFacturaCollection()) {
                if (detalle.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    bk.getListaDetalleFacturacion().add(detalle);
                }
            }
            //bk.setListaDetalleFacturacion(servicioDetalleCompraFacturacion.obtenerDetalleCompraFacturacion(bk.getFacturaSeleccionado().getCoddocventa()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void clearObserver() {
        bk.getObservers().clear();
    }

    @Override
    public void addObserver(IObserver observador) {
        bk.addObservers(observador);
    }
    
    public void elegirDetalleFactura() {
            System.out.println("detalle: "+bk.getFacturaDetalleSeleccionado());
            bk.getDetalleNotaCredito().setCantidad(bk.getFacturaDetalleSeleccionado().getCantidad());
            bk.getDetalleNotaCredito().setPrecioUni(bk.getFacturaDetalleSeleccionado().getPrecioUnitario());
            bk.getDetalleNotaCredito().setDescripcion(bk.getFacturaDetalleSeleccionado().getIdArticulo().getNombreComercial());
            bk.getDetalleNotaCredito().setNumero(bk.getFacturaSeleccionado().getNumeroFactura());
            bk.getDetalleNotaCredito().setSerie(bk.getFacturaSeleccionado().getSerie());
            bk.getDetalleNotaCredito().setIdArticulo(bk.getFacturaDetalleSeleccionado().getIdArticulo().getId());
                    
    }
    
    @Override
    public void notificarObservadores() {
        for (IObserver observer : bk.getObservers()) {
            bk.getDetalleNotaCredito().setImporte(bk.getDetalleNotaCredito().getPrecioUni().multiply(bk.getDetalleNotaCredito().getCantidad()));
            observer.actualizarObservador(bk.getDetalleNotaCredito());
        }
    }
}
